How does thread pool executor work in Java